Stridedslice
对输入张量进行步长切片(Strided Slice)操作。该算子根据起始位置(begins)、结束位置(ends)和步长(strides)从输入张量中提取子张量。该算子不区分数据类型,适用于所有数据类型。
算法支持三种运行模式: 1. 全拷贝模式**(soft_copy_mode = 1):当输出是输入的连续子区域时,使用内存拷贝。 2. **快速运行模式**(fast_run = 1):优化的快速路径,适用于特定场景。 3. **普通模式:逐块拷贝模式,适用于一般情况。
对于每个维度 i,输出张量的索引范围由 begins[i]、ends[i] 和 strides[i] 决定:
- 输入:
input - 输入数据指针(void*)。
in_shape - 输入张量的形状数组(int*),大小为 in_shape_size。
out_shape - 输出张量的形状数组(int*),大小为 out_shape_size。
in_shape_size - 输入张量的维度数(int)。
out_shape_size - 输出张量的维度数(int)。
begins - 起始位置数组(int*),每个维度切片开始的位置。
ends - 结束位置数组(int*),每个维度切片结束的位置。
strides - 步长数组(int*),每个维度的步长。
data_type_bytes - 数据类型所占字节数(int)。
soft_copy_mode - 全拷贝模式标志(int),1 表示启用,0 表示不启用。
fast_run - 快速运行模式标志(int),1 表示启用,0 表示不启用。
split_axis - 策略2:分割轴(int),当输入和输出张量只有1个维度不同时使用。
inner_size - 策略2:内部大小(int)。
outer - 策略2:外部大小(int)。
parallel_on_outer - 策略2:是否在外层并行(int)。
parallel_on_split_axis - 策略2:是否在分割轴并行(int)。
cal_num_per_thread - 策略2:每个线程的计算数量(int)。
caled_num - 策略2:已计算数量(int)。
temp_space - 临时空间指针(void*)。
inner - 策略2:内部大小(int),与 inner_size 类似。
- 输出:
output - 输出数据指针(void*)。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持fp32, int8, int16, int32, fp64, cplx64, cplx128
MT7004 支持fp16, fp32, int16, int32, cplx64
该算子不区分数据类型,适用于所有数据类型
算子会根据 soft_copy_mode 和 fast_run 标志自动选择最优的执行路径
策略2相关参数用于优化特定场景(输入和输出张量只有1个维度不同)
共享存储版本:
-
void stridedslice(void *input, void *output, int *in_shape, int *out_shape, int in_shape_size, int out_shape_size, int *begins, int *ends, int *strides, int data_type_bytes, int soft_copy_mode, int fast_run, int split_axis, int inner_size, int outer, int parallel_on_outer, int parallel_on_split_axis, int cal_num_per_thread, int caled_num, void *temp_space, int inner, int core_mask)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <stridedslice.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在DDR空间
7 // 输入张量形状 [2, 3, 4, 5]
8 int in_shape[] = {2, 3, 4, 5};
9 int in_shape_size = 4;
10
11 // 输出张量形状 [1, 2, 2, 3]
12 // 从 [0, 1, 1, 2] 开始,到 [2, 3, 4, 5] 结束,步长为 [1, 1, 2, 1]
13 int out_shape[] = {1, 2, 2, 3};
14 int out_shape_size = 4;
15
16 // 切片参数
17 int begins[] = {0, 1, 1, 2}; // 每个维度的起始位置
18 int ends[] = {2, 3, 4, 5}; // 每个维度的结束位置
19 int strides[] = {1, 1, 2, 1}; // 每个维度的步长
20
21 // 数据类型:float32,占4字节
22 int data_type_bytes = 4;
23
24 // 输入输出数据指针
25 float *input = (float *)0xA0000000;
26 float *output = (float *)0xB0000000;
27
28 // 运行模式
29 int soft_copy_mode = 0; // 不启用全拷贝模式
30 int fast_run = 0; // 不启用快速运行模式
31
32 // 策略2参数(不使用时可设为0)
33 int split_axis = 0;
34 int inner_size = 0;
35 int outer = 0;
36 int parallel_on_outer = 0;
37 int parallel_on_split_axis = 0;
38 int cal_num_per_thread = 0;
39 int caled_num = 0;
40 int inner = 0;
41
42 // 临时空间
43 void *temp_space = (void *)0xC0000000;
44
45 // 核掩码
46
47 stridedslice(input, output, in_shape, out_shape, in_shape_size, out_shape_size,
48 begins, ends, strides, data_type_bytes, soft_copy_mode, fast_run,
49 split_axis, inner_size, outer, parallel_on_outer, parallel_on_split_axis,
50 cal_num_per_thread, caled_num, temp_space, inner);
51
52 return 0;
53}
私有存储版本:
-
void stridedslice(void *input, void *output, int *in_shape, int *out_shape, int in_shape_size, int out_shape_size, int *begins, int *ends, int *strides, int data_type_bytes, int soft_copy_mode, int fast_run, int split_axis, int inner_size, int outer, int parallel_on_outer, int parallel_on_split_axis, int cal_num_per_thread, int caled_num, void *temp_space, int inner)
C调用示例:
1//FT78NE示例
2#include <stdio.h>
3#include <stridedslice.h>
4
5int main(int argc, char* argv[]) {
6 // 假设在L2空间
7 int in_shape[] = {2, 3, 4, 5};
8 int in_shape_size = 4;
9
10 int out_shape[] = {1, 2, 2, 3};
11 int out_shape_size = 4;
12
13 int begins[] = {0, 1, 1, 2};
14 int ends[] = {2, 3, 4, 5};
15 int strides[] = {1, 1, 2, 1};
16
17 int data_type_bytes = 4;
18
19 float *input = (float *)0x10000000;
20 float *output = (float *)0x10010000;
21
22 int soft_copy_mode = 0;
23 int fast_run = 0;
24
25 // 策略2参数(不使用)
26 int split_axis = 0;
27 int inner_size = 0;
28 int outer = 0;
29 int parallel_on_outer = 0;
30 int parallel_on_split_axis = 0;
31 int cal_num_per_thread = 0;
32 int caled_num = 0;
33 int inner = 0;
34
35 void *temp_space = (void *)0x10020000;
36
37 stridedslice(input, output, in_shape, out_shape, in_shape_size, out_shape_size,
38 begins, ends, strides, data_type_bytes, soft_copy_mode, fast_run,
39 split_axis, inner_size, outer, parallel_on_outer, parallel_on_split_axis,
40 cal_num_per_thread, caled_num, temp_space, inner);
41
42 return 0;
43}